const { src, dest, series, parallel, watch } = require('gulp');
// 删除文件
const del = require('del');

// 引入 ES6 转换插件
const babel = require('gulp-babel');
// 压缩 JS 文件
const uglify = require('gulp-uglify')

// 压缩 HTML
const htmlmin = require('gulp-htmlmin');

// 将 less 转换成 CSS
const less = require('gulp-less')
    // 将 scss 转换成 CSS
var sass = require('gulp-sass')(require('sass'));
// 压缩 css
const csso = require('gulp-csso')

// 运行网络服务器的 Gulp 插件
const connect = require('gulp-connect')

// 处理 HTML 模板
const fileinclude = require('gulp-file-include');

const configPath = {
    // 引入文件目录
    jsPath: './src/js/',
    jsLibs: './src/assets/vendors/',
    htmlPath: './src/',
    htmlAdminPath: './src/admin/',
    cssPath: './src/assets/css/',
    imgPath: './src/assets/img/',
    uploadsPath: './src/uploads/',

    // 导出文件目录
    destJs: './dist/js',
    destJsLiibs: './dist/assets/vendors',
    destHtml: './dist',
    destAdminPath: './dist/admin',
    destCss: './dist/assets/css',
    destImg: './dist/assets/img',
    destUploadsPath: './dist/uploads/',


}

/*----------------------------- JS ----------------------------*/
function js() {
    return src(configPath.jsPath + '**')
        // ES6 转换
        .pipe(babel({ presets: ['@babel/env'] }))
        // 压缩 JS
        .pipe(uglify())
        .pipe(dest(configPath.destJs))
        .pipe(connect.reload());
}
exports.js = js

function copyLibs() {
    return src(configPath.jsLibs + '**')
        .pipe(dest(configPath.destJsLiibs))
        .pipe(connect.reload())
}
exports.copyLibs = copyLibs

/*----------------------------- HTML ----------------------------*/
function html() {
    return src(configPath.htmlPath + '*.html')
        .pipe(fileinclude({
            prefix: '@@',
            basepath: '@file'
        }))
        // 压缩 HTML 去掉换行
        .pipe(htmlmin({ collapseWhitespace: true }))
        .pipe(dest(configPath.destHtml))
        .pipe(connect.reload())
}
exports.html = html

function htmlAdmin() {
    return src(configPath.htmlAdminPath + '*.html')
        .pipe(fileinclude({
            prefix: '@@',
            basepath: '@file'
        }))
        // 压缩 HTML 去掉换行
        .pipe(htmlmin({ collapseWhitespace: true }))
        .pipe(dest(configPath.destAdminPath))
        .pipe(connect.reload())
}
exports.htmlAdmin = htmlAdmin

/*----------------------------- CSS ----------------------------*/
function css() {
    return src([configPath.cssPath + '*.less', configPath.cssPath + '*.scss', configPath.cssPath + '*.css'])
        // 转换 less
        .pipe(less())
        // 转换 scss
        .pipe(sass().on('error', sass.logError))
        .pipe(csso())
        .pipe(dest(configPath.destCss))
        .pipe(connect.reload())
}
exports.css = css

function copyImg() {
    return src(configPath.imgPath + '*')
        .pipe(dest(configPath.destImg))
        .pipe(connect.reload())
}
exports.copyImg = copyImg

function copyUploads() {
    return src(configPath.uploadsPath + '*')
        .pipe(dest(configPath.destUploadsPath))
        .pipe(connect.reload())
}
exports.copyUploads = copyUploads

// function copyMusic() {
//     return src('./src/music/*')
//         .pipe(dest('./dist/music'))
//         .pipe(connect.reload())
// }
// exports.copyMusic = copyMusic


// clean
function clean() {
    return del([configPath.destHtml + '/**']).then(() => {
        console.log('项目初始化清理完成...')
    })
}
exports.clean = clean

/*
    开发模式 启动服务
*/
// watch
function watchList() {
    watch(configPath.htmlPath + '*.html', series(html))
    watch(configPath.htmlAdminPath + '*.html', series(htmlAdmin))
    watch(configPath.cssPath + '*.scss', series(css))
    watch(configPath.cssPath + '*.less', series(css))
    watch(configPath.cssPath + '*.css', series(css))
    watch(configPath.imgPath + '*', series(copyImg))
    watch(configPath.jsPath + '**', series(js))
    watch(configPath.jsLibs + '*', series(copyLibs))
        // watch('./src/music/*', series(copyMusic))
}

// local server
let serverOptions = {
    name: 'development',
    root: './dist',
    host: '127.0.0.1',
    port: 9999,
    livereload: true
}

function server() {
    connect.server(serverOptions)
}
exports.server = series(...init(), parallel(server, watchList))

function init() {
    return [clean, js, copyLibs, html, htmlAdmin, css, copyImg, copyUploads] // , copyMusic
}
/*
    默认 组合 打包 所有任务
*/
exports.default = series(clean, js, copyLibs, html, htmlAdmin, css, copyImg, copyUploads); // , copyMusic










/*------------------------------------------------------------------------------------------------*/

/*
    默认 指令
    gulp 直接执行 会默认执行导出的 default
*/
/*
function defaultTask(cb) {
    // 这是 我们的第一个 gulp 项目
    console.log('这是 我们的第一个 gulp 项目');
    cb();
  }
exports.default = defaultTask
*/


/*------------------------------------------------------------------------------------------------*/
/*
  通过 gulp 执行 导出 指令
  gulp test
*/
function test(cb) {
    console.log('这是测试函数');
    cb()
}
exports.test = test